import java.util.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
 * Write a description of class Afdeling here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Afdeling implements Serializable
{

    private String afdelingNaam;
    private ArrayList<Product> producten;


    /**
     * Constructor for objects of class Afdeling
     */
    public Afdeling(String naam)
    {
        afdelingNaam = naam  ;
        producten = new ArrayList<Product>();
    }
    
    //Vraagt de afdelingnaam op
    public String getAfdelingNaam(){
        return afdelingNaam;
    }
    
    //Geeft lijst van producten in afdeling
    public ArrayList<Product> vraagProductenOp(){
        sorteerProduct();
        return producten;
    }
    
    public void sorteerProduct() {
        int j;
        boolean flag = true;  // will determine when the sort is finished
        Product temp;
        while ( flag ){
            flag = false;
            for ( j = 0;  j < producten.size() - 1;  j++ ){
                if ( producten.get( j ).getNaam().compareToIgnoreCase(producten.get( j+1 ).getNaam() ) > 0 ){                                             
                    // ascending sort
                    temp = producten.get(j);
                    producten.set(j, producten.get( j+1) );     // swapping
                    producten.set(j+1,  temp);
                    flag = true;
                }
            }
        }
    } 
    
    // Zoekt een product op naam
    public Product zoekProduct(String naam){
        Product gezochteproduct = null;
        boolean gelukt = false;
        for(Product p : producten){
            if (!gelukt){
                if(p.getNaam().equalsIgnoreCase(naam)){
                    gezochteproduct = p;
                    gelukt = true;
                }
            }
        }
        return gezochteproduct;
    }
    
    //Kijkt of het product in afdeling ligt
    public boolean bevatProduct(String naam){
        for(Product p:producten){
            if(p.getNaam().equalsIgnoreCase(naam)){
                return true;
            }
        }
        return false;
    }
    
    // Voeg nieuw product toe 
    public void addNieuwProduct(Product product){
        producten.add(product);   
    }
    
    public void bestelProduct(Product product, int besteldeAantal, Datum datum){
        product.addVoorraad(datum,besteldeAantal) ;
    }
    
    //Leg product in schap
    public void legProductInSchap(String naam, int aantal){
        boolean gevonden = false;
        for(Product p : producten){
            if(!gevonden){
                if(p.getNaam().equalsIgnoreCase(naam)){
                    p.addVoorraadAfdeling(aantal);
                    gevonden = true;
                }
            }
        }
    }
    
    public double getInkoopPrijs(Product product){
        for(Product p : producten){
          if(p.getNaam().equalsIgnoreCase(product.getNaam() )){
                return p.getInkoopPrijs();
            }
        }
        return 0.0;
    }
    
    //Als er al product inzit wordt dat bij opgeteld
    public void plusAantal(Product p, int aantal){
        p.plusAantal( p.getHoudbaarheidsDatum(), aantal);
    }

    //Legt producten in schappen zonder dat er iets van het magazijn afgaat.
    public void plusAantalSchappen(Product p, int aantal, Datum datum){
        p.addVoorraadAfdeling(aantal);
        p.addVoorraadMagazijn(aantal, datum);
    }
    
    //controleert of er nog voorraad van is
    public void verwijderVoorraad(){
        for (Product p: producten){
            p.verwijderVoorraad();
        }
    }
    //Kijkt of het opgegeven product er is, en verwijerd hem als het word gevonden.
    public void verwijderProduct(String naam){
        boolean gevonden=false;
        Product gevondenProduct=null;
        for (Product p: producten){
            if(p.getNaam().equalsIgnoreCase(naam) && !gevonden){
                System.out.println("Het product is succesvol verwijderd uit afdeling "+afdelingNaam);
                gevondenProduct=p;
                gevonden=true;
            }
        }
        if(gevonden){
            producten.remove(gevondenProduct);
        }
    }

    public ArrayList<Bonregel> overDatum(){
        ArrayList<Bonregel> bonregels = new ArrayList<Bonregel>();
        Bonregel regel = null;
        for(Product p: producten){
            ArrayList<Bonregel> afgeboekten = p.overDatum();
            for(int i=0;i<afgeboekten.size();i++){
                regel = afgeboekten.get(i);
                bonregels.add( regel );
            }
        }
        return bonregels;
    }
    
    //Kijkt of er iets brand en hoeveel er kapot gaat.
    public double brand(){
        double verlies=0.0;
        for(Product p : producten){
            double random = Math.random()*10;
            if(random<3){
                //Controlleer of er wel producten in de schappen liggen
                if(p.getVoorraadAfdeling()!=0){
                    //Als dat zo is.... BRAND
                    double aantalVerbrandeProducten=Math.random()*10+1;
                    if(p.getVoorraadAfdeling() <= aantalVerbrandeProducten){
                        verlies+=berekenBrandVerlies(p.getInkoopPrijs(), p.getVoorraadAfdeling());
                        p.verwijderVoorraadAfdeling();
                        System.out.println("De gehele voorraad van "+p.getNaam()+" is verband.");
                    }
                    else{
                        verlies+=berekenBrandVerlies(p.getInkoopPrijs(),(int)aantalVerbrandeProducten);
                        p.minVoorraadAfdeling((int)aantalVerbrandeProducten,p.getHoudbaarheidsDatum());
                        System.out.println("Er is brand uitgebroken bij "+p.getNaam()+" "+(int)aantalVerbrandeProducten+" producten zijn verloren gegaan.");
                    }
                }
            }
        }
        return verlies;
    }
    //Berekent de prijs van de verbrande producten...
    public double berekenBrandVerlies(double prijs, int aantal){
        return prijs*aantal;
    }
    
    public void verkoopGegevensWegschrijven(ArrayList<Bon> bonnen){
        for (Product p: producten){
            p.verkoopGegevensWegschrijven( bonnen);
        }
    }
    
}
